今天要來介紹的是verilog的function和task~他們用來定義可重複使用區塊,可以在module內呼叫使用。這兩者有點相似,今天就要來介紹他們在功能和使用場景的不同之處~
這些是使用function要注意的部分:
function的結構大致如下:
module newwork(/*訊號列表*/);
//一些定義
function [return value位寬] name_of_function;
input [位寬] 參數1,參數2,...;
begin
//function body
name_of_function = 表達式;
end
endfunction
//一些指令
name_of_function(參數1,參數2,...);
endmodule
練習寫了一下function(雖然沒有特定意思,就是去加深使用的方法):
module newwork(C);
output C;
reg max;
function [3:0] min;
input [3:0]a,b;
begin
if( a < b )
max = a;
else
max = b;
end
endfunction
reg [3:0] num1, num2, result;
always @(*)
begin
num1 = 4'b0111; //7
num2 = 4'b0101; //5
result = min( num1, num2 );
end
assign C = result;
endmodule
好啦,function大概介紹好了,接著來看task的部分,task跟function差異有些大~
他的特點大概有這些:
task的結構如下:
module newwork(/*訊號列表*/);
//一些定義
task name_of_task;
input [位寬] 輸入參數1,輸入參數2,...;
output [位寬] 輸出參數1, 輸出參數2,...;
inout [位寬] 雙向參數1, 雙向參數2,...;
//宣告內部變量
begin
//task body
end
endtask
//一些指令
endmodule
然後練習用看看(一樣沒什麼特別的意思,就是練習然後加深印象):
module newwork(C);
output C;
reg clk;
task add;
input [3:0] a,b;
output [4:0] sum;
begin
sum <= a + b;
end
endtask
reg [3:0] num1, num2;
reg [3:0] result;
always @(posedge clk)
begin
add(num1, num2, result);
end
initial begin
num1 = 4'b0101; //5
num2 = 4'b0110; //6
end
endmodule
最後來個小小的比較表:
特性 | function | task |
---|---|---|
時間控制敘述 | 不允許 | 允許 |
返回值 | 一個 | 多個 |
調用方式 | 在表達式中使用 | 作為語句調用 |
內部靜態變量 | 不允許 | 允許 |
輸入/輸出文件操作 | 不允許 | 允許 |
可否使用「<=」 | 不允許 | 允許 |
調用task | 不允許 | 允許 |
調用function | 不允許 | 允許 |
今天就先到這邊~